package com.ruoyi.backend.util;

import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.exception.backendEnum.FileUtilsException;
import com.ruoyi.common.utils.uuid.UUID;
import org.apache.commons.compress.utils.FileNameUtils;
import org.apache.commons.io.FileUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

public class CommmonFileUtils {

    /**
     * 文件重命名
     * @param source 需要传递文件路径
     * @param newName 新的文件名即可
     * @return
     */
    public static Boolean fileReName(File source, String newName) {
        String parentName = source.getParent();
        String newPath = parentName + File.separator + newName;
        File target = new File(newPath);
        try {
            if (source.exists()) {
                FileUtils.moveFile(source, target);
            }
        } catch (IOException e) {
            throw new ServiceException(FileUtilsException.FILE_RENAME_ERROR);
        }
        return true;
    }

    /**
     * 生成新的文件路径
     * @param oldFilePath 旧文件路径
     * @return 新文件路径
     */
    public static String generateUUIDPath(String oldFilePath){
        String oldParentPath = new File(oldFilePath).getParent();
        String newFilePath = oldParentPath + File.separator + UUID.randomUUID() + oldFilePath.substring(oldFilePath.lastIndexOf("."));
        return newFilePath;
    }

    /**
     * 生成新的文件名: UUID + 文件扩展名
     * @param oldFilePath 旧文件路径
     * @return 新文件名
     */
    public static String generateUUIDName(String oldFilePath){
        return UUID.randomUUID() + "." + CommmonFileUtils.getExtension(oldFilePath);
    }

    public static String generateUUIDName(MultipartFile File){
        String oldFilePath = File.getOriginalFilename();
        return UUID.randomUUID() + "." + CommmonFileUtils.getExtension(oldFilePath);
    }

    /**
     * 获取文件后缀名
     * @param fileName
     * @return
     */
    public static String getExtension(String fileName) {
        return FileNameUtils.getExtension(fileName);
    }

    /**
     * 获取不会被覆盖的 Minio 存储桶中文件名
     *
     * @param originalFileName 原始文件名
     * @return 带有当前时分秒前缀的新文件名
     */
    public static String getMinioFileName(String originalFileName) {
        // 获取当前时间（时分秒）
        String timePrefix = LocalTime.now().format(DateTimeFormatter.ofPattern("HHmmss"));
        //新文件名为 当前时间时分秒拼接原始文件名
        return timePrefix + "_" + originalFileName;
    }

}
